package data

import (
	"context"
	"medicine/internal/biz"
)

// categoryRepo 分类仓储实现，负责分类相关数据库操作
// 实现了 CategoryRepo 接口
type categoryRepo struct {
	data *DataRepo // 数据层依赖，包含数据库和缓存
}

func NewCategoryRepo(data *DataRepo) biz.CategoryRepo {
	return &categoryRepo{data: data}
}

// Create 创建分类
func (r *categoryRepo) Create(ctx context.Context, c *biz.Category) (*biz.Category, error) {
	if err := r.data.DB.WithContext(ctx).Create(c).Error; err != nil {
		return nil, err
	}
	return c, nil
}

// Update 更新分类
func (r *categoryRepo) Update(ctx context.Context, c *biz.Category) (*biz.Category, error) {
	if err := r.data.DB.WithContext(ctx).Save(c).Error; err != nil {
		return nil, err
	}
	return c, nil
}

// Get 查询分类详情
func (r *categoryRepo) Get(ctx context.Context, id int64) (*biz.Category, error) {
	var c biz.Category
	if err := r.data.DB.WithContext(ctx).First(&c, id).Error; err != nil {
		return nil, err
	}
	return &c, nil
}

// List 分页查询分类列表
func (r *categoryRepo) List(ctx context.Context, page, pageSize int) ([]*biz.Category, int, error) {
	var cs []*biz.Category
	var total int64
	db := r.data.DB.WithContext(ctx)
	db.Model(&biz.Category{}).Count(&total)
	db = db.Offset((page - 1) * pageSize).Limit(pageSize)
	if err := db.Find(&cs).Error; err != nil {
		return nil, 0, err
	}
	return cs, int(total), nil
}

// Delete 删除分类
func (r *categoryRepo) Delete(ctx context.Context, id int64) error {
	return r.data.DB.WithContext(ctx).Delete(&biz.Category{}, id).Error
}

// NameExists 校验分类名唯一性
func (r *categoryRepo) NameExists(ctx context.Context, name string) bool {
	var count int64
	r.data.DB.WithContext(ctx).Model(&biz.Category{}).Where("name = ?", name).Count(&count)
	return count > 0
}

// HasProduct 校验分类是否被商品引用
func (r *categoryRepo) HasProduct(ctx context.Context, categoryId int64) bool {
	var count int64
	r.data.DB.WithContext(ctx).Model(&biz.Product{}).Where("category_id = ?", categoryId).Count(&count)
	return count > 0
}
